2026-10-16T03:25:24.5443963Z ##[group]Run npm run test:deploy
2026-10-16T03:25:24.5444009Z [36;1mnpm run test:deploy[0m
2026-10-16T03:25:24.5444026Z shell: /usr/bin/bash -e {0}
2026-10-16T03:25:24.5444034Z env:
2026-10-16T03:25:24.5444041Z   CARGO_TERM_COLOR: never
2026-10-16T03:25:24.5444127Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-16T03:25:24.5444135Z   WRANGLER_SEND_METRICS: false
2026-10-16T03:25:24.5444142Z ##[endgroup]
2026-10-16T03:25:24.6741438Z 
2026-10-16T03:25:24.6741558Z > test:deploy
2026-10-16T03:25:24.6741583Z > node --test "scripts/deploy/*.test.mjs"
2026-10-16T03:25:24.6741595Z 
2026-10-16T03:25:24.8017837Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (2.226514ms)
2026-10-16T03:25:24.8051078Z ✔ the toolchain is read from rustc -V (0.25714ms)
2026-10-16T03:25:24.8053381Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.2612ms)
2026-10-16T03:25:24.8059131Z ✔ a unit's hash is read from its files and folders (0.28516ms)
2026-10-16T03:25:24.8061241Z ✔ only the units the build did not use are pruned (2.791434ms)
2026-10-16T03:25:27.3040819Z error: no matching package named `base64` found
2026-10-16T03:25:27.4909203Z location searched: crates.io index
2026-10-16T03:25:27.4909362Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-16T03:25:27.4909474Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-16T03:25:27.4909555Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-16T03:25:27.6382064Z ✔ the manifest matches every wrangler config in the repository (38.224832ms)
2026-10-16T03:25:27.6384135Z ✔ every wrangler.jsonc is found, and only checked-in ones (22.843817ms)
2026-10-16T03:25:27.6386775Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (25.854711ms)
2026-10-16T03:25:27.6394268Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.557101ms)
2026-10-16T03:25:27.6396316Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (0.711901ms)
2026-10-16T03:25:27.6396908Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.717071ms)
2026-10-16T03:25:27.6397446Z ✔ shared crates and packages are read from workspace metadata (0.19651ms)
2026-10-16T03:25:27.6399317Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.36121ms)
2026-10-16T03:25:27.6406264Z ✔ services/runner/base.json records the base its folder builds (11.760449ms)
2026-10-16T03:25:27.6408838Z ✔ an image's hash ignores line endings, and its tags say what they are (115.454846ms)
2026-10-16T03:25:27.6409620Z ✔ only the lockfile entries the runner is built from name its image (0.47186ms)
2026-10-16T03:25:27.6417299Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (24.31807ms)
2026-10-16T03:25:27.6421172Z ✔ the registry is asked for an image's manifest, without Docker (1.111132ms)
2026-10-16T03:25:27.6422026Z ✔ a push counts only when it ends with a digest, and is tried again (0.860381ms)
2026-10-16T03:25:27.6422585Z ✔ a static Linux binary is told from a dynamic one (1.044162ms)
2026-10-16T03:25:27.6423690Z ﹣ path dependencies agree with Cargo's own resolved graph (2129.299103ms) # cargo metadata could not resolve offline
2026-10-16T03:25:27.6425136Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (75.239052ms)
2026-10-16T03:25:27.6427031Z ✔ a shared crate's change reaches every unit built from it, and no other (0.835221ms)
2026-10-16T03:25:27.6460278Z ✔ a shared package's change reaches what imports it (0.299001ms)
2026-10-16T03:25:27.6461111Z ✔ a crate's tests, benches and examples deploy nothing (1.513142ms)
2026-10-16T03:25:27.6461653Z ✔ a Rust file compiled only for tests is found from what declares it (1.433103ms)
2026-10-16T03:25:27.6479798Z ✔ this repository's test-only sources are read from git (237.345152ms)
2026-10-16T03:25:27.6479892Z ✔ decide: a change only to tests deploys nothing (1.557323ms)
2026-10-16T03:25:27.6479949Z ✔ own folders, declared inputs and root files (0.866261ms)
2026-10-16T03:25:27.6480008Z ✔ a Cargo.lock change reaches only crates that use what changed (0.53596ms)
2026-10-16T03:25:27.6480066Z ✔ a package-lock change reaches through workspace links (0.551231ms)
2026-10-16T03:25:27.6480118Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.36188ms)
2026-10-16T03:25:27.6480188Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.19203ms)
2026-10-16T03:25:27.6480246Z ✔ decide: Cargo.lock counts only where it reaches (0.41477ms)
2026-10-16T03:25:27.6480819Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.49134ms)
2026-10-16T03:25:27.6480887Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (1.577993ms)
2026-10-16T03:25:27.6480947Z ✔ units are picked by short name, folder or Worker name (0.585731ms)
2026-10-16T03:25:27.6481000Z ✔ a CI job installs only what its units need (1.058632ms)
2026-10-16T03:25:27.6481052Z ✔ a deploy is annotated with its commit, and read back (0.23052ms)
2026-10-16T03:25:27.6481110Z ✔ the live commit: the live version's, looking through secret changes (0.425361ms)
2026-10-16T03:25:27.6481164Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.401031ms)
2026-10-16T03:25:27.6481392Z ✔ the API's answers: the live commit as Wrangler's would give it (0.958851ms)
2026-10-16T03:25:28.1376986Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (502.703231ms)
2026-10-16T03:25:28.1378792Z ✔ the API is used only with the token Wrangler would be given (0.499511ms)
2026-10-16T03:25:28.1380988Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.679203ms)
2026-10-16T03:25:28.2015828Z ✔ the pool runs everything, no more than its limit at once (16.212346ms)
2026-10-16T03:25:28.2016746Z ✔ self-hosting builds every Rust service the manifest says it runs (0.792471ms)
2026-10-16T03:25:28.2022905Z ✔ the self-hosting architecture page names every unit (0.338161ms)
2026-10-16T03:25:28.2023938Z ✔ the architecture's services page names every unit, with the services it binds to (3.606966ms)
2026-10-16T03:25:28.2024195Z ✔ resolveStack works on a manifest with no workspace crates or packages (3.584276ms)
2026-10-16T03:25:28.2048195Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.29371ms)
2026-10-16T03:25:28.2048311Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.797953ms)
2026-10-16T03:25:28.2057943Z ✔ a failed wrangler command is reported by its error, not its trace (0.229161ms)
2026-10-16T03:25:28.2058152Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.34666ms)
2026-10-16T03:25:28.2063044Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.245101ms)
2026-10-16T03:25:28.2106039Z ✔ the deploy tool itself parses: a test that never imports it would not notice (35.588817ms)
2026-10-16T03:25:28.6576654Z ✔ the statements are all there (1.227082ms)
2026-10-16T03:25:28.6577438Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (44.652342ms)
2026-10-16T03:25:28.6577551Z ✔ revoking an unused invite gives it back; an expired one never counted (86.94916ms)
2026-10-16T03:25:28.6577633Z ✔ a used invite is spent: revoking it does nothing and it still counts (39.850374ms)
2026-10-16T03:25:28.6577695Z ✔ a pending invite for the same address is found; a revoked one is not (41.116796ms)
2026-10-16T03:25:28.6577760Z ✔ staff grants add to the twenty and can take some back (40.959927ms)
2026-10-16T03:25:28.6577818Z ✔ signing up from the link spends the invite once and records who invited whom (50.134691ms)
2026-10-16T03:25:28.6676471Z ✔ a body that broke off is worth another try, a lockfile out of step is not (1.701062ms)
2026-10-16T03:25:28.6689542Z ✔ an install that ends without saying why, or stalls, is tried again (0.215081ms)
2026-10-16T03:25:28.6690245Z ✔ a dropped connection is tried again until the install passes (2.066393ms)
2026-10-16T03:25:28.6703735Z ✔ a real error fails at once (0.219791ms)
2026-10-16T03:25:28.6711683Z ✔ it gives up after its tries, with npm's exit code (0.28405ms)
2026-10-16T03:25:28.6719436Z ✔ a stalled install is run again (0.22481ms)
2026-10-16T03:25:28.8459266Z ✔ webhooks: the hourly purge deletes old deliveries by time (2.172173ms)
2026-10-16T03:25:28.8459429Z ✔ billing: this month's users are read from an index, not the ledger (61.81793ms)
2026-10-16T03:25:28.8460841Z ✔ events: a repository's events of one type, newest first, page by page (4.399297ms)
2026-10-16T03:25:28.8461142Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (17.464878ms)
2026-10-16T03:25:28.8462448Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (3.265055ms)
2026-10-16T03:25:28.8462649Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (2.991905ms)
2026-10-16T03:25:28.8462827Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (3.437555ms)
2026-10-16T03:25:28.9618946Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (5.076328ms)
2026-10-16T03:25:28.9626952Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.52543ms)
2026-10-16T03:25:28.9632401Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (0.760562ms)
2026-10-16T03:25:28.9641007Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.37366ms)
2026-10-16T03:25:28.9647176Z ✔ image references and bearer challenges are read (0.57542ms)
2026-10-16T03:25:28.9663220Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (29.099926ms)
2026-10-16T03:25:28.9663623Z ✔ a base that is not where it should be, or not what base.json says, stops it (1.287142ms)
2026-10-16T03:25:28.9663909Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (2.135333ms)
2026-10-16T03:25:29.0404789Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-16T03:25:29.0726902Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-16T03:25:29.0763346Z ✔ fields read numbers, ranges, lists and steps (2.057023ms)
2026-10-16T03:25:29.0789151Z ✔ the services' crons match when hosted g1t's would fire (1.866403ms)
2026-10-16T03:25:29.0817744Z ✔ what is due is each matching cron of each service (0.438271ms)
2026-10-16T03:25:29.0818033Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (37.41479ms)
2026-10-16T03:25:29.2038460Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (39.164873ms)
2026-10-16T03:25:29.2058859Z ✔ an announcement that fails is a warning, never a failed deploy (0.731511ms)
2026-10-16T03:25:29.2059178Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (1.073602ms)
2026-10-16T03:25:29.2059393Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.736841ms)
2026-10-16T03:25:29.2229318Z ℹ tests 92
2026-10-16T03:25:29.2229633Z ℹ suites 0
2026-10-16T03:25:29.2229790Z ℹ pass 91
2026-10-16T03:25:29.2229932Z ℹ fail 0
2026-10-16T03:25:29.2230084Z ℹ cancelled 0
2026-10-16T03:25:29.2230233Z ℹ skipped 1
2026-10-16T03:25:29.2230531Z ℹ todo 0
2026-10-16T03:25:29.2230675Z ℹ duration_ms 4505.112473
